package router

import (
	"e_mall_server/controller/admin"
	"e_mall_server/controller/mall"
	"e_mall_server/logger"
	"e_mall_server/middlewares"
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"net/http"
)

/**
 * @Author: zhaobin
 * @Description 初始化路由
 * @Date: 2022-04-25 15:25
 */

func SetupRouter(mode string) *gin.Engine {
	//if mode == gin.ReleaseMode {
	//	gin.SetMode(gin.ReleaseMode) //gin设置成发布模式
	//}
	r := gin.New()

	r.Use(logger.GinLogger(), logger.GinRecovery(true))
	// 支持所有的跨域请求
	r.Use(cors.Default())

	// 刷新验证码
	r.GET("/api/captcha", admin.Captcha)
	// 登陆请求
	r.POST("/api/login", admin.Login)

	adminRouters := r.Group("/api/admin", middlewares.JWTManagerAuthMiddleware)
	{
		// 上传轮播图图片
		adminRouters.POST("/upload", admin.FileUpload)

		// 获取左侧菜单权限列表
		adminRouters.GET("/menu", admin.GetMenuList)

		// 增加角色信息
		adminRouters.POST("/role", admin.AddRole)
		// 修改角色信息
		adminRouters.PUT("/role", admin.UpdateRole)
		// 删除角色信息
		adminRouters.DELETE("/role/:id", admin.DeleteRole)
		// 查询角色信息
		adminRouters.GET("/role", admin.GetRoleList)
		// 通过id查询角色信息
		adminRouters.GET("/role/:id", admin.GetRoleDetailById)
		// 通过角色id获取其对应的权限
		adminRouters.GET("/role/access/:id", admin.GetRoleAccessById)
		// 给角色分配权限
		adminRouters.POST("/role/auth/access/:id", admin.AuthAccessToRole)

		// 增加管理员信息
		adminRouters.POST("/manager", admin.AddManager)
		// 修改管理员信息
		adminRouters.PUT("/manager", admin.UpdateManager)
		// 删除管理员信息
		adminRouters.DELETE("/manager/:id", admin.DeleteManager)
		// 查询管理员信息
		adminRouters.GET("/manager", admin.GetManagerList)
		// 通过id查询管理员信息
		adminRouters.GET("/manager/:id", admin.GetManagerDetailById)

		// 增加权限信息
		adminRouters.POST("/access", admin.AddAccess)
		// 修改权限信息
		adminRouters.PUT("/access", admin.UpdateAccess)
		// 删除权限信息
		adminRouters.DELETE("/access/:id", admin.DeleteAccess)
		// 查询权限信息
		adminRouters.GET("/access", admin.GetAccessList)
		// 通过id查询权限信息
		adminRouters.GET("/access/:id", admin.GetAccessDetailById)

		// 轮播图管理相关接口
		// 增加轮播图信息
		adminRouters.POST("/carousel", admin.AddCarousel)
		// 修改轮播图信息
		adminRouters.PUT("/carousel", admin.UpdateCarousel)
		// 删除轮播图信息
		adminRouters.DELETE("/carousel/:id", admin.DeleteCarousel)
		// 查询轮播图信息
		adminRouters.GET("/carousel", admin.GetCarouselList)
		// 通过id查询轮播图信息
		adminRouters.GET("/carousel/:id", admin.GetCarouselDetailById)

		// 商品分类管理相关接口
		// 增加商品分类信息
		adminRouters.POST("/goodsCate", admin.AddGoodsCate)
		// 修改商品分类信息
		adminRouters.PUT("/goodsCate", admin.UpdateGoodsCate)
		// 删除商品分类信息
		adminRouters.DELETE("/goodsCate/:id", admin.DeleteGoodsCate)
		// 查询商品分类信息
		adminRouters.GET("/goodsCate", admin.GetGoodsCateList)
		// 通过id查询商品分类信息
		adminRouters.GET("/goodsCate/:id", admin.GetGoodsCateDetailById)

		// 商品分类参数管理相关接口
		// 增加商品分类参数信息
		adminRouters.POST("/goodsCateAttribute", admin.AddGoodsCateAttribute)
		// 修改商品分类参数信息
		adminRouters.PUT("/goodsCateAttribute", admin.UpdateGoodsCateAttribute)
		// 删除商品分类参数信息
		adminRouters.DELETE("/goodsCateAttribute/:id", admin.DeleteGoodsCateAttribute)
		// 通过cateId查询商品分类参数信息
		adminRouters.GET("/goodsCateAttribute", admin.GetGoodsCateAttributeListByCateId)
		// 通过id查询商品参数分类信息
		adminRouters.GET("/goodsCateAttribute/:id", admin.GetGoodsCateAttributeDetailById)

		// 商品管理相关接口
		// 增加商品信息
		adminRouters.POST("/goods", admin.AddGoods)
		// 修改商品信息
		adminRouters.PUT("/goods", admin.UpdateGoods)
		// 删除商品信息
		adminRouters.DELETE("/goods/:id", admin.DeleteGoods)
		// 查询商品信息
		adminRouters.GET("/goods", admin.GetGoodsList)
		// 通过id查询商品信息
		adminRouters.GET("/goods/:id", admin.GetGoodsDetailById)

		// 获取商品颜色列表
		adminRouters.GET("/goodsColor", admin.GetGoodsColorList)

		// 导航管理相关接口
		// 增加导航信息
		adminRouters.POST("/nav", admin.AddNav)
		// 修改导航信息
		adminRouters.PUT("/nav", admin.UpdateNav)
		// 删除导航信息
		adminRouters.DELETE("/nav/:id", admin.DeleteNav)
		// 查询导航信息
		adminRouters.GET("/nav", admin.GetNavList)
		// 通过id查询导航信息
		adminRouters.GET("/nav/:id", admin.GetNavDetailById)

		// 商城设置相关接口
		// 修改商城设置信息
		adminRouters.PUT("/setting", admin.UpdateSetting)
		// 通过id查询商城设置信息
		adminRouters.GET("/setting/:id", admin.GetSettingDetailById)

		// 订单管理相关接口
		// 修改订单信息
		adminRouters.PUT("/order", admin.UpdateOrder)
		// 删除订单信息
		adminRouters.DELETE("/order/:id", admin.DeleteOrder)
		// 查询订单信息
		adminRouters.GET("/order", admin.GetOrderList)
		// 通过id查询订单信息
		adminRouters.GET("/order/:id", admin.GetOrderDetailById)

	}

	mallRouters := r.Group("/api/mall")
	{
		// 导航栏相关接口
		// 获取顶部导航列表
		mallRouters.GET("/nav/top", mall.GetTopNavList)
		// 获取顶部导航列表
		mallRouters.GET("/nav/mid", mall.GetMidNavList)

		// 获取轮播图列表
		mallRouters.GET("/carousel", mall.GetCarouselList)

		// 获取分类列表
		mallRouters.GET("/goodsCate/:id", mall.GetGoodsCateList)

		// 获取商品列表
		mallRouters.GET("/goods", mall.GetGoodsListByQuery)
		// 通过id查询商品信息
		mallRouters.GET("/goods/:id", mall.GetGoodsDetailById)

		// 获取商品所关联的图片信息
		mallRouters.GET("/goodsImage/:id", mall.GetGoodsImageListByGoodsId)

		// 添加购物车
		mallRouters.POST("/cart/:id", mall.AddCart)
		// 查询购物车
		mallRouters.GET("/cart", mall.GetCartList)
		// 修改购物车商品数量
		mallRouters.PUT("/cart/num", mall.UpdateCartNum)
		// 修改购物车商品是否选中
		mallRouters.PUT("/cart/checked", mall.UpdateCartChecked)
		// 修改购物车商品是否全选
		mallRouters.PUT("/cart/allChecked", mall.UpdateCartAllChecked)
		// 删除购物车中商品信息
		mallRouters.DELETE("/cart", mall.DeleteCartGoods)

		// 用户登陆
		mallRouters.POST("/login", mall.LoginUser)

	}
	mallRouters.Use(middlewares.JWTUserAuthMiddleware)
	{
		// 添加收获地址
		mallRouters.POST("/address", mall.AddAddress)
		// 查询地址列表
		mallRouters.GET("/address/:userId", mall.GetAddressList)
		// 修改收获地址
		mallRouters.PUT("/address", mall.UpdateAddress)
		// 删除收获地址
		mallRouters.DELETE("/address/:id", mall.DeleteAddress)

		// 查询选中的购物车商品
		mallRouters.GET("/cart/checked", mall.GetCheckedCartList)

		// 生成订单
		mallRouters.POST("/order", mall.AddOrder)
		// 通过用户id查询所有订单
		mallRouters.GET("/order/:userId", mall.GetOrderList)
		// 通过订单id查询订单信息
		mallRouters.GET("/order/detail/:orderId", mall.GetOrderByOrderId)
		// 通过订单id删除订单信息
		mallRouters.DELETE("/order/:id", mall.DeleteOrder)
	}

	r.GET("/ping", func(c *gin.Context) {
		c.String(http.StatusOK, "success")
	})

	return r
}
